#include "controller.h"
#include "defaultpage.h"
#include "mainwindow.h"
#include "Enums.h"
#include "api.h"
#include "uimanager.h"
#include <QApplication>
#include <QString>
#include <QDialog>
#include "services.h"
#include <QThread>
#include "orderdialog.h"
#include "queryresult.h"
#include "queryresultmodel.h"
#include <QStyledItemDelegate>
Controller::Controller() {
    Api::getInstance()->readToken();
    CheckLogin();
    us = new UserModel();
    fl = nullptr;
}
void Controller::LoginDone(){
}

//}
void Controller::setUIManager(UIManager *t){
    this->ui = t;
}
void Controller::RequestForVerify(QString email){
    //QString email = this->em->ui->txt_email->text();
    // 调用API接口发送验证码
    // 参数说明：
    // 1. 接口路径：/api/v1/sendVerifyCode
    // 2. 请求参数：邮箱地址
    // 3. 超时时间：5000毫秒
    // 4. 回调函数：处理发送结果
    Services::sendEmail(email);
}
/**
 * 注册请求函数
 * 该函数用于显示用户注册界面，并执行模态对话框
 *
 * @return 无返回值
 */
void Controller::RegisterRequested(){
    ui->getFrmRegister()->exec(); // 获取注册窗体指针并执行模态对话框
}
/**
 * @brief 执行邮箱验证器请求
 *
 * 该函数用于触发邮箱验证器的执行，通过调用UI界面中的getEmailVerifier()方法
 * 并执行其exec()函数来显示邮箱验证对话框。
 *
 * @note 此函数通常在需要用户验证邮箱身份时被调用
 */
void Controller::EmailVerifierRequested(){
    ui->getEmailVerifier()->exec(); // 执行邮箱验证对话框
}
/**
 * @brief Controller类的成员函数，用于请求显示注册界面
 *
 * 该函数会调用UI界面中的注册对话框，并以模态方式显示
 * 当用户完成注册操作后，对话框会关闭
 */
void Controller::RequestForRegister(){
    ui->getFrmRegister()->exec(); // 获取注册对话框实例并以模态方式执行
}
/**
 * @brief 退出应用程序函数
 *
 * 该函数用于退出整个应用程序，通过调用QApplication的quit()方法实现。
 * 当用户请求退出程序时，此函数会被调用以确保应用程序能够正确关闭。
 *
 * @note 这是一个成员函数，属于Controller类
 */
void Controller::exitApp(){
    // 调用QApplication的quit()方法退出应用程序
    QApplication::quit();
}

void Controller::CheckLogin() {
    Api::getInstance()->post(
        "/api/v1/checkLogin",
        {
            {"token", Api::getInstance()->getToken()},
        },
        5000,
        [this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
            qDebug()<<response;
            //判断请求是否成功
            if(success){
                ui->getFrmLogin()->accept();
            }else{
                qDebug()<< "getCity 服务器错误出现: "<<errmsg<<" "<<statuscode;
            }
        }
    );
}

/**
 * @brief 控制器的Start方法，用于启动应用程序
 * 该方法获取登录窗口、主窗口和默认页面的实例，
 * 并根据登录窗口的执行结果决定是显示主窗口还是退出应用程序
 */
void Controller::Start(){
    // 获取登录窗口实例
    Frm_Login* lg = ui->getFrmLogin();
    // 获取主窗口实例
    MainWindow* mainw = ui->getMainWindow();
    // 获取默认页面实例
    DefaultPage* df = ui->getDefaultPage();
    //frm_UserPage* pg = ui->getUserPage();
    //pg->setUser(User("huhao","pass","pass","pass",Role::adult,10));
    //pg->show();
    // while (isLogin==-1) {
    //     qDebug()<<isLogin;
    // }

    if(lg->exec()==QDialog::Accepted){
        // 如果登录成功，切换主窗口的堆叠窗口到默认页面
        mainw->switchStackedWidget(df);
        // 显示主窗口
        mainw->show();
    }else{
        // 如果登录取消或失败，退出应用程序
        exitApp();
    }

    bool finish = false;
    QEventLoop loop; // 局部事件循环，不阻塞全局UI

    // 发起异步请求
    Services::getStation([this, &finish, &loop](bool success, const QJsonObject& response, const QString errmsg, int statuscode) {
        if (success) {
            ui->getDefaultPage()->InitStations(response);
        } else {
            qDebug() << "getStation 服务器错误出现: " << errmsg << " " << statuscode;
        }
        finish = true;
        loop.quit(); // 回调执行后，退出局部事件循环
    });

    // 设置超时定时器（5秒后强制退出循环）
    QTimer::singleShot(5000, &loop, &QEventLoop::quit);

    // 启动局部事件循环（非阻塞全局UI，UI仍可响应）
    loop.exec();

    // 等待结束后判断结果
    if (finish) {
        qDebug() << "请求成功完成";
    } else {
        qDebug() << "请求超时（5秒）";
    }

    //      cities.append({"111","222","333"});
    // QString jsonStr = R"(
    // {
    //     "data": [
    //         {"name": "北京西站", "type": "TrainStation"},
    //         {"name": "上海虹桥站", "type": "PlaneStation"},
    //         {"name": "广州南站", "type": "TrainStation"},
    //         {"name": "深圳北站", "type": "高铁站"},
    //         {"name": "成都东站", "type": "综合交通枢纽"}
    //     ]
    // }
    // )";
    // QString jsonss = R"(
    // {
    //     "data":[
    //         "BeiJing",
    //         "ShangHai"
    //     ]
    // }
    // )";
    // QJsonObject emptyObj;

    // // 1. 字符串转QJsonDocument
    // QJsonParseError parseError;
    // QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &parseError);
    // QJsonDocument jsondd = QJsonDocument::fromJson(jsonss.toUtf8(),&parseError);
    // 4. 转为QJsonObject并返回

   // ui->getDefaultPage()->InitCities(jsondd.object());
    Services::getCity([this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
        //判断请求是否成功
        if(success){
            ui->getDefaultPage()->InitCities(response);
        }else{
            qDebug()<< "getCity 服务器错误出现: "<<errmsg<<" "<<statuscode;
        }
    });
}
/**
 * 控制器类的请求查询方法
 * @param t 指向查询包(QueryPackage)的指针
 */
void Controller::RequestForQueryModel(QueryPackage* t){
    delete fl;
    if(t->qrytype==OneWay||t->qrytype==RoundTrip||t->qrytype==Tranfer||t->qrytype==Refund||t->qrytype==OnTime){
        fl = QueryResultModel::getModel(t);
        //QueryModelPageSet(1);
        ui->getQueryPage()->setTable(fl);
        ui->getQueryPage()->setPage(1);
        ui->getMainWindow()->switchStackedWidget(ui->getQueryPage());
    }else if(t->qrytype==CheckPoint){
        Services::sendSimpQuery(t,[this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
            qDebug()<<response;
            if(success){
                QMessageBox::information(nullptr,"Query",response["data"].toString());
                qDebug()<<"正常";
            }else{
                qDebug()<<"服务器错误出现:"<<errmsg<<" "<<statuscode;
                SetDefault();
            }
        });
    }else if(t->qrytype==OnSale){
        Services::sendSimpQuery(t,[this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
            qDebug()<<response;
            if(success){
                QMessageBox::information(nullptr,"Query",response["data"].toString());
                qDebug()<<"正常";
            }else{
                qDebug()<<"服务器错误出现:"<<errmsg<<" "<<statuscode;
            }
        });
    }
}
void Controller::RequestNewUser(User * user,QString veri){
    Services::sendRegister(user,veri);
}
/**
 * @brief Controller类的请求登录方法
 * @param u 用户名
 * @param p 密码
 * @param tp 登录类型
 */
void Controller::RequestForLogin(QString u, QString p,QString tp){
    // 调用Services类的sendLoginRequest方法发送登录请求
    // 使用lambda表达式处理响应结果
    Services::sendLoginRequest(u,p,tp,[this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
        qDebug()<<response;
        // 判断请求是否成功
        if(success){
            // 登录成功，调用UI层的登录完成方法
            ui->LoginDone();
            // 从响应中获取token并保存到用户服务对象
            us->token = response["token"].toString();
            qDebug()<<us->token;
            Api::getInstance()->setGlobalToken(us->token);
        }else{
            qDebug()<<"服务器错误出现: "<<errmsg<<" "<<statuscode;
        }
    });
    //ui->LoginDone();
}
void Controller::QueryModelPageSet(int page){
    qDebug()<<fl->getQueryPackage()->toJson().value("traintype").toString();
    QEventLoop loop;
    Services::sendQuery(fl->getQueryPackage(),page,fl->getSize(),[this,&loop](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
        qDebug()<<response;
        if(success){
            fl->setResult(response);
            qDebug()<<"正常";
        }else{
            qDebug()<<"服务器错误出现:"<<errmsg<<" "<<statuscode;
            ui->getQueryPage()->setPage(fl->getPage());
            fl->setPage(fl->getPage());
        }
        loop.quit();
    });
    // 设置超时定时器（5秒后强制退出循环）
    QTimer::singleShot(5000, &loop, &QEventLoop::quit);

    // 启动局部事件循环（非阻塞全局UI，UI仍可响应）
    loop.exec();
}
void Controller::SetDefault(){
    ui->getQueryPage()->clean();
    ui->getMainWindow()->switchStackedWidget(ui->getDefaultPage());
}
void Controller::OrderPageRequested(QueryResult* res){
    OneWayDelegate* o = new OneWayDelegate();
    OrderDialog od(res,o,us->users);
    od.exec();
    delete o;
}
void Controller::UserPageRequested(){
    this->ui->getUserPage()->setUser(this->us->CurrentUser);
}
void Controller::changeUserData(User t){
    this->us->CurrentUser = t;
    qDebug()<<"请求已完成";
}
void Controller::OrderModelRequest(){
    delete fl;
    User u = us->CurrentUser;
    fl = QueryResultModel::getModel(new RefundQuery(u.id,u.type,QDate::fromString("1970-01-01","yyyy-MM-dd"),QDate::currentDate(),"","default"));
    ui->getUserPage()->OrderRequestDone(fl);
}
void Controller::RequestForUserPage(){
    this->ui->getMainWindow()->switchStackedWidget(ui->getUserPage());
}
void Controller::RequestForUserModel(){
    Services::getUserList(us->CurrentUser.id,[this](bool success,const QJsonObject& response,const QString errmsg,int statuscode){
        if(success){
            this->us->users = User::fromJsonList(response);
            this->ui->getUserPage()->UserModelRequestDone(us);
        }else{
            qDebug()<<errmsg;
        }
    });
}
